ফাংশন হলো একটি কোড ব্লক যা নির্দিষ্ট কাজ সম্পাদন করে এবং যেটি একটি নাম দ্বারা পরিচিত। ফাংশনের মাধ্যমে কোড পুনরায় ব্যবহারযোগ্য হয়, যার ফলে প্রোগ্রামটি সহজ, পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য হয়ে ওঠে। সি প্রোগ্রামে ফাংশন ব্যবহার করা হয় একাধিক স্থানে একই কাজ করতে, ফলে কোডের পুনরাবৃত্তি কমে যায়।
ফাংশন দুটি ধাপে বিভক্ত:
return_type function_name(parameter1, parameter2, ...) {
// function body
// code to perform the task
return value; // optional, depends on return_type
}
ব্যাখ্যা:
int
, float
, char
ইত্যাদি)। যদি ফাংশন কোনো মান না ফেরত দেয় তবে void
ব্যবহার হয়।return_type
কিছু রিটার্ন করতে নির্দেশ করে। void
ফাংশনে রিটার্ন মান থাকে না।#include <stdio.h>
// Function declaration
int add(int a, int b);
int main() {
int result = add(5, 3); // Function call
printf("The sum is: %d\n", result);
return 0;
}
// Function definition
int add(int a, int b) {
return a + b;
}
ব্যাখ্যা:
add
ফাংশন দুটি ইনপুট নেয় (int a
এবং int b
) এবং তাদের যোগফল ফিরিয়ে দেয়।main()
ফাংশনে add(5, 3)
ফাংশন কল করা হয় এবং রিটার্ন ভ্যালু result
এ সংরক্ষিত হয়।#include <stdio.h>
// Function declaration
void printHello();
// Main function
int main() {
printHello(); // Function call
return 0;
}
// Function definition
void printHello() {
printf("Hello, World!\n");
}
ব্যাখ্যা:
void printHello()
একটি void ফাংশন যা কোনো মান ফেরত দেয় না, তবে স্ক্রীনে Hello, World! প্রিন্ট করে।#include <stdio.h>
// Function declaration
void swap(int *x, int *y);
int main() {
int a = 5, b = 10;
printf("Before swap: a = %d, b = %d\n", a, b);
swap(&a, &b); // Function call with address of variables
printf("After swap: a = %d, b = %d\n", a, b);
return 0;
}
// Function definition
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
ব্যাখ্যা:
swap
ফাংশন পয়েন্টার ব্যবহার করে দুটি ভেরিয়েবলের মান বদলাচ্ছে। *x
এবং *y
মানের মধ্যে সরাসরি পরিবর্তন করার জন্য পয়েন্টার ব্যবহার করা হচ্ছে।&a
এবং &b
দিয়ে a
এবং b
এর মেমরি অ্যাড্রেস পাস করা হচ্ছে।রিকার্সিভ ফাংশন হলো এমন একটি ফাংশন যা নিজের মধ্যে নিজেকে কল করে। সাধারণত সমস্যা ছোট ছোট অংশে বিভক্ত করার জন্য রিকার্সন ব্যবহৃত হয়।
#include <stdio.h>
// Function declaration
int factorial(int n);
int main() {
int result = factorial(5);
printf("Factorial of 5 is: %d\n", result);
return 0;
}
// Recursive function definition
int factorial(int n) {
if (n == 0) {
return 1; // Base case
} else {
return n * factorial(n - 1); // Recursive call
}
}
ব্যাখ্যা:
n
০ হয় তখন এটি বেস কেস 1
রিটার্ন করে।factorial(5)
এর মান হবে 5 * 4 * 3 * 2 * 1 = 120
।int add(int a, int b)
।void swap(int *a, int *b)
।সি ফাংশন প্রোগ্রামিংয়ের একটি শক্তিশালী উপাদান, যা কোডের পুনঃব্যবহারযোগ্যতা, কোডের সুষমতা এবং উন্নত ডিবাগিং সক্ষমতা প্রদান করে। ফাংশনটি বিভিন্ন ধরনের হতে পারে, যেমন সাধারণ ফাংশন, void ফাংশন, রিকার্সিভ ফাংশন, এবং পয়েন্টার সহ ফাংশন। সি ভাষায় ফাংশনের মাধ্যমে সমস্যা সমাধানকে সহজতর এবং দ্রুত করা সম্ভব।
এই অধ্যায়ে আপনি সি প্রোগ্রামিং এ ইউজার ডিফাইন্ড এবং স্টান্ডার্ড লাইব্রেরী উভয় ফাংশনের সঙ্গে পরিচিত হবেন। এছাড়া আপনি প্রোগ্রামিং এর ফাংশন ব্যবহার শিখবেন।
ফাংশন হলো ব্লক অব কোড(block of code) যা কোনো নির্দিষ্ট কার্য সম্পাদন করে।
ধরুন, একটি গ্রাফিক্স প্রোগ্রাম তৈরি করতে একটি বর্গ, একটি বৃত্ত এবং কিছু কালারের প্রয়োজন যা ইউজার কর্তৃক যথাক্রমে দৈর্ঘ্য, ব্যাসার্ধ এবং কালারের উপর নির্ভর করে। এই সমস্যা সমাধান করতে আপনি তিনটি ফাংশন ব্যবহার করতে পারেন।
- বর্গ ফাংশন
- বৃত্ত ফাংশন
- কালার ফাংশন
বড় বড় সমস্যাগুলো ক্ষুদ্র ক্ষুদ্র অংশে বিভক্ত করলে প্রোগ্রাম বুঝতে এবং ডেভেলপ করতেও সহজ হয়।
ইউজার কর্তৃক সংজ্ঞায়িত ফাংশন এবং কম্পাইলারে ইতিমধ্যে বিদ্যমান ফাংশনের উপর ভিত্তিকরে সি প্রোগ্রামিং এ দুই ধরণের ফাংশন রয়েছে। যথাঃ
সি প্রোগ্রামিং এ স্টান্ডার্ড লাইব্রেরী ফাংশন হলো পূর্ব নির্ধারিত ফাংশন বা সি এর নিজস্ব ফাংশন যা দ্বারা গাণিতিক হিসাব-নিকাশ, ইনপুট-আউটপুট প্রোসেসিং, স্ট্রিং হ্যান্ডলিং ইত্যাদি কার্য সম্পাদন করা যায়।
এই ফাংশনগুলো হেডার ফাইলে ডিফাইন্ড করা থাকে। ঐ সব হেডার ফাইলকে যখন কোনো প্রোগ্রামে সংযুক্ত করা হয় তখন এই ফাংশনগুলো সোর্স কোডে নিজস্ব ফাংশনের ন্যায় কাজ করে। উদাহরনস্বরুপঃ
printf()
হলো স্টান্ডার্ড লাইব্রেরী ফাংশন যা স্ক্রিনে ফরম্যাটেড আউটপুট পাঠায়। এই ফাংশনটি "stdio.h"
হেডার ফাইলে ডিফাইন্ড করা থাকে।
এছাড়া আরো অনেক ফাংশন রয়েছে যেগুলো "stdio.h"
হেডার ফাইলে ডিফাইন্ড করা থাকে যেমন- scanf()
, getchar()
, fprintf()
ইত্যাদি। যখন-ই আপনি "stdio.h"
হেডার ফাইলকে আপনার প্রোগ্রামে সংযুক্ত করবেন তখন-ই এই ফাংশনগুলো আপনার প্রোগ্রামের জন্য সচরাচর হয়ে যাবে।
আরোও জানতে সি প্রোগ্রামিং এর স্টান্ডার্ড লাইব্রেরী ফাংশন অধ্যায় ভিজিট করুন।
ইতিমধ্যেই উল্লেখ করা হয়েছে যে, সি প্রোগ্রামিং ফাংশন ডিফাইনে সম্মতি দিয়ে থাকে। এই ফাংশনগুলো ইউজার কর্তৃক ডিফাইন্ড করা হয় বলে এগুলোকে ইউজার ডিফাইন্ড ফাংশন বলা হয়।
প্রোগ্রামের দাবি এবং জটিলতার উপর ভিত্তিকরে আপনি যত ইচ্ছা ফাংশন ডিফাইন্ড করতে পারেন।
#include <stdio.h> void userDefinedFunction() { ... .. ... ... .. ... } int main() { ... .. ... ... .. ... userDefinedFunction(); ... .. ... ... .. ... }
সি প্রোগ্রামের এক্সিকিউশন শুরু হয় main()
ফাংশন থেকে।
কম্পাইলার যখন userDefinedFunction();
ফাংশনের দেখা পায় তখন প্রোগ্রামের নিয়ন্ত্রণ লাফ দিয়ে void userDefinedFunction()
এর কাছে যায়।
কম্পাইলার তখন ইউজার ডিফাইন্ড ফাংশনের কোডসমূহ এক্সিকিউশন করা শুরু করে।
ইউজার ডিফাইন্ড ফাংশনের কোডসমূহ এক্সিকিউশন সম্পন্ন হলে প্রোগ্রামের নিয়ন্ত্রণ পূনরায় লাফ দিয়ে main()
ফাংশনের userDefinedFunction();
এর কাছে চলে আসে।
মনে রাখবেন, ফাংশনের নাম হলো আইডেন্টিফায়ার যা অবশ্যই ইউনিক হতে হবে।
ইহা ইউজার ডিফাইন্ড ফাংশনের ওভারভিউ। আরো জানতে নিচের পেজসমূহ ভিজিট করুনঃ
- প্রোগ্রাম বুঝা, রক্ষণাবেক্ষণ এবং ডিবাগিং করা সহজ হয়ে যায়।
- পূনর্ব্যবহারযোগ্যতা বৃদ্ধি পাওয়ায় অন্যান্য প্রোগ্রামেও কোড ব্যবহার করা যায়।
- বড় প্রোগ্রাম ক্ষুদ্র ক্ষুদ্র মডিউলে বিভক্ত করা যায়। সুতরাং বড় প্রোজেক্টকে অনেক প্রোগ্রামারের কাছে ভাগ করে দেওয়া যায়।
সি প্রোগ্রামিং ফাংশন ডিফাইন্ড করার অনুমতি দেয়। এই অধ্যায়ে আপনি সি প্রোগ্রামিং এ ইউজার ডিফাইন্ড(user defined) ফাংশন তৈরি করা শিখবেন।
ফাংশন হলো ব্লক অব কোড(block of code) যা কোনো নির্দিষ্ট কার্য সম্পাদন করে।
সি প্রোগ্রামিং আপনার প্রয়োজন অনুসারে ফাংশন ডিফাইন্ড করার অনুমতি দিয়ে থাকে। এই ফাংশনসমূহ ইউজার ডিফাইন্ড ফাংশন নামে পরিচিত। উদাহরনস্বরুপঃ
ধরুন, একটি গ্রাফিক্স প্রোগ্রাম তৈরি করতে একটি বর্গ, একটি বৃত্ত এবং কালারের প্রয়োজন যা ইউজার কর্তৃক যথাক্রমে দৈর্ঘ্য, ব্যাসার্ধ এবং কালারের উপর নির্ভর করে। এই সমস্যা সমাধান করতে আপনি তিনটি ফাংশন ব্যবহার করতে পারেন।
- বর্গ ফাংশন
- বৃত্ত ফাংশন
- কালার ফাংশন
নিচের উদাহরণে দুটি ইন্টেজার নাম্বারের গুণের প্রোগ্রাম দেখানো হলো। এই কাজ সম্পাদনের জন্য একটি ইউজার ডিফাইন্ড ফাংশন multiplyNumbers()
ডিফাইন্ড করা হয়েছে।
kt_satt_skill_example_id=313
ফাংশন প্রোটোটাইপ দ্বারা সাধারণত ফাংশনের ডিক্লেয়ারেশনকে বুঝায় যাতে ফাংশনের নাম, প্যারামিটার এবং রিটার্ন টাইপ নির্ধারণ করা থাকে। এতে ফাংশনের বডি(body) অর্থাৎ ফাংশন ডেফিনিশন থাকে না।
ফাংশন প্রোটোটাইপ কম্পাইলারকে আগাম বার্তা দেয় যে, প্রোগ্রামে এই ফাংশনটি পরে কখনো ব্যবহার করা হতে পারে।
returnType functionName(type1 argument1, type2 argument2,...);
উপরের প্রোগ্রামে int multiplyNumbers(int a, int b);
হলো ফাংশন প্রোটোটাইপ যা কম্পাইলারকে নিম্নোক্ত তথ্যসমূহ দিয়ে থাকেঃ
multiplyNumbers() হলো ফাংশনের নাম
int হলো ফাংশনের রিটার্ন টাইপ
int টাইপের দুটি আর্গুমেন্ট ফাংশনের মধ্য দিয়ে অতিক্রম করবে।
ইউজার ডিফাইন্ড ফাংশন
main()
এর পূর্বে ডিফাইন্ড করা হলে ফাংশন প্রোটোটাইপের প্রয়োজন হয় না।
কল করার মাধ্যমে প্রোগ্রামের নিয়ন্ত্রণ ইউজার ডিফাইন্ড ফাংশনের কাছে স্থানান্তরিত হয়।
functionName(argument1, argument2, ...);
উপরের উদাহরণে main()
ফাংশনের মধ্য থেকে multiplyNumbers(n1,n2);
স্টেটমেন্ট ব্যবহার করে ফাংশনকে কল করা হয়েছে।
নির্দিষ্ট কার্য সম্পাদনের জন্য ফাংশন ডেফিনিশন কিছু কোডের ব্লক নিয়ে গঠিত হয়। যেমন- উপরের উদাহরণে ফাংশনের রিটার্ন টাইপ এবং ফাংশন ডেফিনিশনের মধ্যে দুটি সংখ্যা গুণ করার জন্য কিছু কোড ব্যবহার করা হয়েছে।
returnType functionName(type1 argument1, type2 argument2, ...)
{
//ফাংশনের বডি(body)
}
ফাংশনকে যখন কল করা হয় তখন প্রোগ্রামের নিয়ন্ত্রণ ফাংশন ডেফিনিশনে স্তানান্তরিত হয়। কম্পাইলার ফাংশন বডির মধ্যে অবস্থিত কোডসমূহ এক্সিকিউশন করা শুরু করে।
প্রোগ্রামিং এ আর্গুমেন্ট দ্বারা ভ্যারিয়েবলকে বুঝায় যা ফাংশনের মধ্য দিয়ে অতিক্রম করে। উপরের উদাহরণে ফাংশন কলের সময় num1 এবং num2 ভ্যারিয়েবল দুটি ফাংশনের মধ্য অতিক্রম করে।
ফাংশন ডেফিনিশনের প্যারামিটার a এবং b অতিক্রান্ত আর্গুমেন্ট দুটি গ্রহণ করে। এই আর্গুমেন্ট সমূহকে ফাংশনের ফরমাল(formal) প্যারামিটার বলা হয়।
ফাংশনের মধ্য দিয়ে অতিক্রান্ত আর্গুমেন্ট এবং ফরমাল প্যারামিটারকে অবশ্যই এক হতে হবে নতুবা কম্পাইলার এরর(error) নিক্ষেপ করবে।
যদি num1 ইন্টেজার টাইপের হয় তাহলে a কে অবশ্যই ইন্টেজার টাইপের হতে হবে। যদি num2 ডাবল টাইপের হয় তাহলে b ভ্যারিয়েবলকে অবশ্যই double টাইপের হতে হবে।
ফাংশনের মধ্য দিয়ে আর্গুমেন্ট অতিক্রম করানো ছাড়াও ফাংশনকে কল করা যায়।
return স্টেটমেন্ট ফাংশন এক্সিকিউশের সমাপ্তি ঘটায় এবং কল করা ফাংশনের কাছে ভ্যালু ফেরত পাঠায়। রিটার্ন স্টেটমেন্টের পরে প্রোগ্রামের কন্ট্রোল কলিং(calling) ফাংশনের কাছে স্থানান্তরিত হয়
উপরের উদাহরণে result ভ্যারিয়েবলের ভ্যালু main()
ফাংশনের multiplication ভ্যারিয়েবলের এর কাছে ফেরত পাঠায়।
return (expression);
return sum;
return (x+y);
ফাংশন থেকে রিটার্নকৃত ভ্যালুর টাইপ এবং ফাংশন প্রোটোটাইপ ও ফাংশন ডেফিনিশনের রিটার্ন টাইপ অবশ্যই একই হতে হবে।
এই অধ্যায়ে আপনি ফাংশন ব্যবহার করে একই সমস্যা বিভিন্ন পদ্ধতিতে সমাধান করা শিখবেন।
ফাংশনের রিটার্ন ভ্যালু এবং আর্গুমেন্ট-সমূহ ভালভাবে বুঝার জন্য ইউজার ডিফাইন্ড ফাংশন কে নিম্নোক্ত ক্যাটাগরিতে ভাগ করা যেতে পারেঃ
নিচের চারটি প্রোগ্রামেই ইউজার মৌলিক(prime) সংখ্যা প্রবেশ করায় কিনা চেক করার প্রোগ্রাম। সবগুলো প্রোগ্রাম একই ফলাফল দেখায়।
#include <stdio.h>
int checkPrimeNumber(int n);
int main()
{
int n, flag;
printf("Enter a positive integer: ");
scanf("%d",&n);
/* checkPrimeNumber() ফাংশনের মধ্য দিয়ে n কে অতিক্রম করানো হয়।
ফাংশন থেকে রিটার্নকৃত ভ্যালু flag ভ্যারিয়েবলে জমা হয়*/
flag = checkPrimeNumber(n);
if(flag==1)
printf("%d is not a prime number",n);
else
printf("%d is a prime number",n);
return 0;
}
// এই ফাংশন থেকে integer রিটার্ন হয়।
int checkPrimeNumber(int n)
{
/*checkPrimeNumber() ফাংশন থেকে পূর্ণ সংখ্যা(Integer number) রিটার্ন হয় */
int i;
for(i=2; i <= n/2; ++i)
{
if(n%i == 0)
return 1;
}
return 0;
}
ইউজার কর্তৃক ইনপুট checkPrimeNumber()
ফাংশনের মধ্য দিয়ে অতিক্রম করানো হয়।
checkPrimeNumber()
ফাংশন অতিক্রান্ত আর্গুমেন্ট মৌলিক সংখ্যা কিনা চেক করে। অতিক্রান্ত আর্গুমেন্ট মৌলিক সংখ্যা হলে ফাংশন 0 রিটার্ন করে। অতিক্রান্ত আর্গুমেন্ট মৌলিক সংখ্যা না হলে 1 রিটার্ন করে। রিটার্ন ভ্যালু flag ভ্যারিয়েবলে এসাইন হয়।
অবশেষে main()
ফাংশন থেকে উপযুক্ত ম্যাসেজ প্রদর্শিত হয়।
#include <stdio.h>
void checkPrimeNumber();
int main()
{
checkPrimeNumber(); // checkPrimeNumber() ফাংশনের মধ্য দিয় কোনো আর্গুমেন্ট অতিক্রম করানো হয় নি।
return 0;
}
// ফাংশন থেকে কোনো ভ্যালু রিটার্ন না হওয়ায় রিটার্ন টাইপ void রাখা হয়েছে।
void checkPrimeNumber()
{
int n, i, flag=0;
printf("Enter a positive integer: ");
scanf("%d",&n);
for(i=2; i <= n/2; ++i)
{
if(n%i == 0)
{
flag = 1;
}
}
if (flag == 1)
printf("%d is not a prime number.", n);
else
printf("%d is a prime number.", n);
}
checkPrimeNumber()
ফাংশন ইউজার থেকে ইনপুট গ্রহণ করে, ইনপুট ভ্যালু প্রাইম নাম্বার কিনা চেক করে এবং স্ক্রিনে উপযুক্ত ম্যাসেজ দেখায়।
main()
ফাংশনের মধ্যে checkPrimeNumber();
ফাংশনের ফাঁকা বন্ধনী এই নির্দেশ করে যে, ফাংশনের মধ্য দিয়ে কোনো ভ্যালু অতিক্রম করতে পারবে না।
checkPrimeNumber();
ফাংশনের রিটার্ন টাইপ void
হওয়ায় ইহা কোনো ভ্যালু রিটার্ন করে না।
#include <stdio.h>
int getInteger();
int main()
{
int n, i, flag = 0;
//ফাংশনের মধ্য দিয় কোনো আর্গুমেন্ট অতিক্রম করানো হয় নি।
// ফাংশন থেকে রিটার্নকৃত ভ্যালু n ভ্যারিয়েবলে জমা হয়।
n = getInteger();
for(i=2; i<=n/2; ++i)
{
if(n%i==0){
flag = 1;
break;
}
}
if (flag == 1)
printf("%d is not a prime number.", n);
else
printf("%d is a prime number.", n);
return 0;
}
// getInteger() ফাংশন থেকে পূর্ণ সংখ্যা(Integer number) রিটার্ন করে।
int getInteger()
{
int n;
printf("Enter a positive integer: ");
scanf("%d",&n);
return n;
}
n = getInteger();
ফাংশনের ফাঁকা বন্ধনী নির্দেশ করে যে, ফাংশনের মধ্য দিয়ে কোন ভ্যালু অতিক্রম করবে এবং ফাংশন থেকে রিটার্ন ভ্যালু n ভ্যারিয়েবলে এসাইন হবে।
এখানে getInteger()
ফাংশন ইউজার থেকে ইনপুট গ্রহণ করে এবং ইহা রিটার্ন করে। সংখ্যাটি মৌলিক কিনা চেক করার জন্য কোড main()
ফাংশনে রয়েছে।
#include <stdio.h>
void checkPrimeAndDisplay(int n);
int main()
{
int n;
printf("Enter a positive integer: ");
scanf("%d",&n);
// n is passed to the function
checkPrimeAndDisplay(n);
return 0;
}
// void indicates that no value is returned from the function
void checkPrimeAndDisplay(int n)
{
int i, flag = 0;
for(i=2; i <= n/2; ++i)
{
if(n%i == 0){
flag = 1;
break;
}
}
if(flag == 1)
printf("%d is not a prime number.",n);
else
printf("%d is a prime number.", n);
}
ইউজার কর্তৃক প্রবেশ করানো ইন্টেজার নাম্বার checkPrimeAndDisplay()
ফাংশনের মধ্য দিয়ে অতিক্রম করানো হয়।
checkPrimeAndDisplay()
ফাংশন অতিক্রান্ত আর্গুমেন্ট মৌলিক সংখ্যা কিনা চেক করে এবং উপযুক্ত ম্যাসেজ ডিসপ্লে করে।
আপনি কি ধরণের সমস্যা সমাধান করতে চাচ্ছেন ইহা তার উপর নির্ভর করে। আমাদের সমস্যার ক্ষেত্রে প্রথমটি সবচেয়ে ভাল।
নির্দিষ্ট কার্য হাসিল করার জন্য ফাংশন ব্যবহার করা উচিৎ। আমাদের প্রথম প্রোগ্রামে checkPrimeNumber()
ফাংশনটি ইউজার থেকে কোনো ধরনের ইনপুট গ্রহণ করে না এবং কোনো ম্যাসেজও ডিসপ্লে করে না। ইহা শুধুমাত্র সংখ্যাটি মৌলিক সংখ্যা কিনা চেক করে যা প্রোগ্রামকে মডিউলারে পরিনত করে। ফলে প্রোগ্রাম বুঝতে ও ডিবাগিং করতে সহজ হয়।
এই অধ্যায়ে আপনি সি প্রোগ্রামিং এ রিকার্সন ফাংশন তৈরি করা শিখবেন।
যে ফাংশন নিজেই নিজেকে কল(call) করে তাকে বলা হয় রিকার্সিভ(recursive) ফাংশন এবং এই কৌশলকে বলা হয় রিকার্সন(recursion)।
void recurse() { ... .. ... recurse(); ... .. ... } int main() { ... .. ... recurse(); ... .. ... }
প্রতিবন্ধকতা সৃষ্ট করে এমন কিছু কন্ডিশনের দেখা না পাওয়া পর্যন্ত রিকার্সন চলতেই থাকে।
অসীম রিকার্সনকে বাধা দেওয়ার জন্য if...else স্টেটমেন্ট অথবা এধরনের অন্য কোনো স্টেটমেন্ট ব্যবহার করা যেতে পারে যেখানে এক অংশ রিকার্সিভ হবে, কিন্তু অন্যান্য অংশ রিকার্সিভ হবে না।
kt_satt_skill_example_id=332
উপরের প্রোগ্রামে number ভ্যারিয়েবল sum()
ফাংশনের মধ্যে দিয়ে আর্গুমেন্ট হিসাবে অতিক্রম হয় এবং main()
ফাংশন থেকে sum()
ফাংশন প্রাথমিকভাবে কল(call) হয়।
ধরুন, num এর প্রাথমিক ভ্যালু 3। পরবর্তী ফাংশন কলে sum()
ফাংশনের মধ্য দিয়ে 2 অতিক্রম করানো হয়। num এর ভ্যালু 0 এর সমান না হওয়া পর্যন্ত এই প্রক্রিয়া চলতে থাকে।
যখন num এর ভ্যালু 0 এর সমান হয় তখন if কন্ডিশন ব্যার্থ হয় এবং else অংশ এক্সিকিউশন হয়ে যোগফল main()
ফাংশনের কাছে রিটার্ন করে।
রিকার্সন প্রোগ্রামকে সহজ এবং স্বচ্ছ রাখে। রিকার্সন ব্যবহার করে সকল এলগরিদমকে পৌনঃপুনিকভাবে(recursively) ডিফাইন্ড করা যেতে পারে। ফলে ইহা বুঝা এবং প্রমাণ করা উভয়ই সহজ হয়ে যায়।
আপনার প্রোগ্রামের মুখ্য বিষয় যদি দ্রুতগতি সম্পন্ন হয় তাহলে রিকার্সন না ব্যবহার করাই ভাল। কারণ রিকার্সন মেমোরির অনেক জায়গা দখল করে এবং সাধারণত ধীর গতির হয়। ইহার পরিবর্তে আপনি লুপ ব্যবহার করতে পারেন।
এই অধ্যায়ে আপনি লোকাল(local) এবং গ্লোবাল (global) ভ্যারিয়েবলের স্কোপ(scope) এবং লাইফটাইম(lifetime) সম্মন্ধে জানবেন। এছাড়া স্ট্যাটিক(static) এবং রেজিস্টার(register) ভ্যারিয়েবল সম্বন্ধেও জানবেন।
সি প্রোগ্রামিং এ প্রতিটি ভ্যারিয়েবলের দুটি বৈশিষ্ট্য থাকে। যথাঃ
- টাইপ
- স্টোরেজ ক্লাস
টাইপ দ্বারা ভ্যারিয়েবলের ডাটা টাইপকে বুঝায় এবং স্টোরেজ ক্লাস ভ্যারিয়েবলের স্কোপ এবং লাইফটাইম নির্ধারন করে।
সি প্রোগ্রামিং এ চার ধরনের স্টোরেজ ক্লাস আছে।
- অটোম্যাটিক-automatic
- এক্সটার্নাল-external
- স্ট্যাটিক-static
- রেজিস্টার-register
ফাংশনের মধ্যে ডিক্লেয়ার করা ভ্যারিয়েবল-সমূহকে অটোম্যাটিক বা লোকাল ভ্যারিয়েবল বলা হয়।
লোকাল ভ্যারিয়েবল-সমূহ শুধুমাত্র ফাংশনের মধ্যে বিদ্যমান থাকে। ফাংশনের কাজ সম্পন্ন হয়ে গেলে লোকাল ভ্যারিয়েবল খতম হয়ে যায়।
int main() {
int num; // এখানে num হলো main() ফাংশনের লোকাল ভ্যারিয়েবল
... .. ...
}
void add() {
int num1; // এখানে num1 হলো add() ফাংশনের লোকাল ভ্যারিয়েবল
... .. ...
}
ফাংশনের বাহিরে ডিক্লেয়ার করা ভ্যারিয়েবল-সমূহকে গ্লোবাল বা এক্সটার্নাল ভ্যারিয়েবল বলা হয়। যেকোনো ফাংশন থেকে গ্লোবাল বা এক্সটার্নাল ভ্যারিয়েবল-সমূহকে এক্সেস করা যায়।
kt_satt_skill_example_id=345
ধরুন, একটি গ্লোবাল ভ্যারিয়েবলকে file1
এ ডিক্লেয়ার করা হয়েছে। আপনি যদি ভিন্ন আরেকটি ফাইল file2
থেকে ঐ ভ্যারিয়েবলকে এক্সেস করতে চান তাহলে কম্পাইলার অভিযোগ করবে।
এই সমস্যা সমাধানের জন্য file2
তে extern
কীওয়ার্ড ব্যবহার করা হয় যা ফাইলকে নির্দেশ করে যে, এক্সটার্নাল ভ্যারিয়েবলকে ভিন্ন কোনো ফাইলে ডিক্লেয়ার(declare) করা হয়েছে।
সি প্রোগ্রামিং এ রেজিস্টার ভ্যারিয়েবল ডিক্লেয়ারের জন্য register
কীওয়ার্ড ব্যবহৃত হয়। রেজিস্টার ভ্যারিয়েবলকে লোকাল ভ্যারিয়েবলের তুলনায় দ্রুত গতির মনে করা হয়।
যাইহোক আধুনিক কম্পাইলারসমূহ কোড অপটিমাইজেশনের জন্য খুবই ভাল এবং যাতে রেজিস্টার ভ্যারিয়েবল ব্যবহৃত প্রোগ্রাম দ্রুত গতি সম্পন্ন হওয়ার সুযোগ খুবই কম থাকে।
সম্প্রসারিত সিস্টেমে ব্যবহৃত এপ্লিকেশনের জন্য কোড কিভাবে অপটিমাইজ করতে হয় তা পূর্বে থেকে জানা না থাকলে রেজিস্টার ভ্যারিয়েবল ব্যবহারের কোনো প্রয়োজন নাই।
সি প্রোগ্রামিং এ স্ট্যাটিক static
ব্যবহৃত হয়। উদাহরণস্বরূপঃ
static int age;
প্রোগ্রামে যখন ফাংশনের কাজ শেষ হয়ে যায় তখন এর সঙ্গে এর ভেতরের লোকাল ভ্যারিয়েবল গুলোও নিঃশেষ হয়ে যায়। প্রোগ্রাম শেষ না হওয়া পর্যন্ত কোনো লোকাল ভ্যারিয়েবলকে জীবিত রাখার জন্য static
কীওয়ার্ড ব্যবহৃত হয়।
প্রোগ্রাম শেষ না হওয়া পর্যন্ত স্ট্যাটিক ভ্যারিয়েবলের ভ্যালু বিদ্যমান থাকে।
kt_satt_skill_example_id=347
প্রথম ফাংশন কলে count ভ্যারিয়েবলের ভ্যালু 0 ছিল , দ্বিতীয় ফাংশন কলে এর ভ্যালু বৃদ্ধি হয়ে 10 হয়।
দ্বিতীয় ফাংশন কলের সময় count ভ্যারিয়েবলের ভ্যালু পূনরায় 0 এসাইন হয় না। কারণ count এখানে স্ট্যাটিক ভ্যারিয়েবল। অবশেষে 10 স্ক্রিনে প্রদর্শিত হয়।
common.read_more